# -*- coding: utf-8 -*-
# owner: shenyi
# file: src/providers/base.py

from abc import ABC, abstractmethod
from ast import In
from typing import Optional

# 导入请求和响应模型
from src.models.instance import (
    CreateInstanceRequest,
    DeleteInstanceRequest,
    InstanceTypeRequest,
    QueryInstanceRequest,
    AvailableInstanceTypeRequest,
)
from src.models.responses import (
    CreateResponse,
    DeleteResponse,
    InstanceTypeResponse,
    AvailableZonesInstanceTypeResponse,
    InstanceListResponse
)


class BaseProvider(ABC):
    """
    云厂商提供者抽象基类（Abstract Base Class）

    所有具体的云厂商实现（如 AliyunProvider、TencentProvider）必须继承此类
    并实现所有抽象方法，以保证接口一致性。
    """

    def __init__(self, **config):
        """
        初始化基础提供者

        :param config: 其他配置项（由子类处理）
        """
        self.config = config

    @abstractmethod
    async def create_instance(self, request: CreateInstanceRequest) -> CreateResponse:
        """
        创建云服务器实例

        :param request: 创建实例请求对象
        :return: 创建结果响应
        """
        pass

    @abstractmethod
    async def delete_instance(self, request: DeleteInstanceRequest) -> DeleteResponse:
        """
        删除（释放）云服务器实例

        :param request: 删除实例请求对象
        :return: 删除结果响应
        """
        pass
    
    @abstractmethod
    async def list_instances(self, request: QueryInstanceRequest) -> InstanceListResponse:
        """
        查询指定区域或可用区的实例列表

        :param request: 实例列表查询
        :return: 实例列表响应
        """
        pass

    @abstractmethod
    async def list_instance_types(self, request: InstanceTypeRequest) -> InstanceTypeResponse:
        """
        查询指定区域或可用区的实例规格列表

        :param request: 实例规格查询请求
        :return: 实例规格响应
        """
        pass

    @abstractmethod
    async def list_available_instance_types(
        self, request: AvailableInstanceTypeRequest
    ) -> AvailableZonesInstanceTypeResponse:
        """
        查询支持指定镜像的可用实例规格（通常用于创建前推荐）

        :param request: 可用实例规格查询请求
        :return: 包含可用区和实例类型的响应
        """
        pass
    

    async def health_check(self) -> bool:
        """
        健康检查：检测与云厂商的连接是否正常

        子类可重写此方法（例如调用 DescribeRegions 或类似接口）

        :return: True 表示健康，False 表示异常
        """
        try:
            # 示例：调用一个轻量级 API
            await self.list_instance_types(
                InstanceTypeRequest(region=self.region or "default")
            )
            return True
        except Exception:
            return False